bitkeeper revision 1.1159.1.198 (415d8662Q0wZZexKh1EdIwW80jQLLg)
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 1 Oct 2004 16:31:30 +0000 (16:31 +0000)
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 1 Oct 2004 16:31:30 +0000 (16:31 +0000)
Rearrange time init so that xtime and processed_system_time don't start
out of sync.  Update wall_to_monotonic when we update time from xen.

linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c

index 935e7c3698f061ab3fa15fcc61d9dcd182cb3721..3a251b40828ee24bc539519a2328834bfea17f51 100644 (file)
@@ -363,8 +363,10 @@ EXPORT_SYMBOL(monotonic_clock);
 static inline void do_timer_interrupt(int irq, void *dev_id,
                                        struct pt_regs *regs)
 {
-       s64 delta;
-       long sec_diff;
+       time_t wtm_sec, sec;
+       s64 delta. nsec;
+       long sec_diff, wtm_nsec;
+       long wtm_nsec;
 
        __get_time_values_from_xen();
 
@@ -412,10 +414,17 @@ static inline void do_timer_interrupt(int irq, void *dev_id,
                }
 
                /* Update our unsynchronised xtime appropriately. */
-               xtime.tv_sec  = shadow_tv.tv_sec;
-               xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
+               sec = shadow_tv.tv_sec;
+               nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
+
+               __normalize_time(&sec, &nsec);
+               wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
+               wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
 
-               last_update_from_xen = xtime.tv_sec;
+               set_normalized_timespec(&xtime, sec, nsec);
+               set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
+
+               last_update_from_xen = sec;
        }
 
 #ifdef CONFIG_XEN_PRIVILEGED_GUEST
@@ -590,17 +599,16 @@ void __init time_init(void)
                return;
        }
 #endif
-       xtime.tv_sec = HYPERVISOR_shared_info->wc_sec;
+       __get_time_values_from_xen();
+       xtime.tv_sec = shadow_tv.tv_sec;
        wall_to_monotonic.tv_sec = -xtime.tv_sec;
-       xtime.tv_nsec = HYPERVISOR_shared_info->wc_usec * NSEC_PER_USEC;
+       xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
        wall_to_monotonic.tv_nsec = -xtime.tv_nsec;
+       processed_system_time = shadow_system_time;
 
        cur_timer = select_timer();
        printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
 
-       __get_time_values_from_xen();
-       processed_system_time = shadow_system_time;
-
        time_irq = bind_virq_to_irq(VIRQ_TIMER);
 
        (void)setup_irq(time_irq, &irq_timer);